home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer (Italian) 30 / PC Gamer IT CD 30 1-2.iso / MOTS / GAMEDATA / RESOURCE / JKMRES.GOO / cog_kyle_m.cog < prev    next >
Text File  |  1998-02-25  |  41KB  |  1,387 lines

  1. # Jedi Knight Missions Cog Script
  2. #
  3. # KYLE_M.COG
  4. #
  5. # Main script for the player. Handles things like saber info,
  6. # saber blocking animations, invulnerability at respawn, etc.
  7. #
  8. # [YB & CYW]
  9. #
  10. # (C) 1997 LucasArts Entertainment Co. All Rights Reserved
  11.  
  12. symbols
  13.  
  14. thing       player                           local
  15.  
  16. # The force-like weapon effects are handled in kyle_m.cog
  17. # (since the projectile will be gone by the time the
  18. # effects wear off.)
  19.  
  20. thing       victim                           local
  21. thing       perp                             local
  22.  
  23. thing       meCarbonited                     local
  24. thing       aiCarbonited                     local
  25. template    carboDummy=+CarboniteChar        local
  26.  
  27. template    csTpl=+CarboniteStem             local
  28. template    c0Tpl=+CarboDebris_0             local
  29. template    c1Tpl=+CarboDebris_1             local
  30. template    c2Tpl=+CarboDebris_2             local
  31. template    c3Tpl=+CarboDebris_3             local
  32. template    c4Tpl=+CarboDebris_4             local
  33.  
  34. int         debris                           local
  35. int         carboSector                      local
  36. vector      carboPosition                    local
  37.  
  38. int         oldFlags                         local
  39.  
  40. sound       hmmmSound=mj61031.wav            local
  41.  
  42. int         iAlignmentPriority=-1            local
  43.  
  44. int         nextBlock=0                      local
  45. int         bin                              local
  46. int         rank                             local
  47.  
  48. int         force_blinding=0                 local
  49. int         blindingEffectHandle=-1          local
  50. int         frozenEffectHandle=-1            local
  51. int         flashEffectHandle=-1             local
  52. int         PulledWeapon                     local
  53.  
  54. int         i                                local
  55. int         j                                local
  56. int         k                                local
  57. int         m                                local
  58.  
  59. int         playersector                     local
  60. vector      playerpos                        local
  61. int         bub                              local
  62.  
  63. vector      tempvec                          local
  64. flex        tempflex                         local
  65.  
  66. flex        defenseFactor=1.0                local
  67. sound       defenseSound=ForceDefense.wav    local
  68.  
  69. template    carboExplode=+sparks             local
  70.  
  71. template    tpl=+FPBryarPistol               local
  72. template    tpl1                             local
  73. template    tpl2=+FPBryarPistol              local
  74. template    tpl3=+FPSTrifle                  local
  75. template    tpl4=+FPDetoLive                 local
  76. template    tpl5                             local
  77. template    tpl6=+FPRepeaterGun              local
  78. template    tpl7=+FPRailGun                  local
  79. template    tpl8=+seqchrg2                   local
  80. template    tpl9=+FPConcRifle                local
  81. template    tpl10=+FPBryarPistol             local
  82. template    tpl11=+FPLightSaber              local
  83. template    tpl12=+FPBlastech                local
  84. template    tpl13=+FPScope                   local
  85. template    tpl14=+FPDetoLive                local
  86. template    tpl15=+FPCrossbow                local
  87. template    tpl16=+FPRepeaterGun             local
  88. template    tpl17=+FPRailSeek                local
  89. template    tpl18=+seqchrg2                  local
  90. template    tpl19=+FPConcRifle               local
  91. template    tpl20=+FPCarbGun                 local
  92.  
  93. template    batteryTpl=+FPBattery            local
  94.  
  95. template    smoke_tpl=+heavysmoke            local
  96. int         smoke                            local
  97.  
  98. int         totalStop                        local
  99.  
  100. template    teleport_particles=+telesparks   local
  101. sound       teleportsnd=ForceThrow01.WAV     local
  102.  
  103. sound       freezeSound=freeze.WAV           local
  104. sound       thawSound=thaw.WAV               local
  105.  
  106. template    bubble_tpl=bubble                local
  107. template    bubble_tpl2=bubble2              local
  108. template    bubble_tpl3=bubble3              local
  109.  
  110. template    splash_tpl=+watersplash          local
  111. template    splash_tpl2=+watersplash2        local
  112. int         a_splash                         local
  113. int         sender                           local
  114. int         source                           local
  115.  
  116. keyframe    povBlockAnim0=SabVblk0.key       local
  117. keyframe    povBlockAnim1=SabVblk1.key       local
  118. keyframe    povBlockAnim2=SabVblk2.key       local
  119.  
  120. keyframe    blockAnim0=KYblock0.key          local
  121. keyframe    blockAnim1=KYblock1.key          local
  122. keyframe    blockAnim2=KYblock2.key          local
  123.  
  124. material    tip_mat=saberorange0.mat         local
  125. material    side_mat=saberorange1.mat        local
  126.  
  127. template    tpl_wall=+ssparks_wall           local
  128. template    tpl_blood=+ssparks_blood         local
  129. template    tpl_saber=+ssparks_saber         local
  130.  
  131. int         dummy=0                          local
  132. int         blockPOVTrack=-1                 local
  133. int         blockTrack=-1                    local
  134. int         curWeapon                        local
  135. int         primaryWeapon                    local
  136.  
  137. int         griptrackID=-1                   local
  138.  
  139. int         frozenNow=0                      local
  140. int         flashNow=0                       local
  141.  
  142. flex        ftemp                            local
  143. flex        extraFreezeTime=0                local
  144. flex        extraBlindTime=0                 local
  145. flex        flashLevelR=0                    local
  146. flex        flashLevelG=0                    local
  147. flex        flashLevelB=0                    local
  148.  
  149. flex        myParam=0.0                      local
  150.  
  151. flex        damageType                       local
  152. flex        damage                           local
  153.  
  154. int         killedByRancor=0                 local
  155.  
  156. int         inbubble=0                       local
  157.  
  158. message     startup
  159. message     killed
  160. message     newplayer
  161. message     timer
  162. message     blocked
  163. message     skill
  164. message     damaged
  165. message     splash
  166. message     user0
  167. message     user1
  168. message     user5
  169. message     enterbubble
  170. message     exitbubble
  171. message     preblock
  172. message     trigger
  173. message     shutdown
  174.  
  175. end
  176.  
  177. # ========================================================================================
  178.  
  179. code
  180.  
  181. startup:
  182.    player = GetLocalPlayerThing();
  183.  
  184.    // Let everyone know we're Kyle and not that Mara person.
  185.    SetInv(player, 67, 0.0);
  186.  
  187.    // Turn Kyle's saber Orange.
  188.    jkSetSaberInfo(player, side_mat, tip_mat, 0.003, 0.001, 0.120, tpl_wall, tpl_blood, tpl_saber);
  189.  
  190.    if(!IsMulti()) call init_kyle;
  191.  
  192.    SetTimerEx(0.1, 2006, 0, 0);     // Reset camera zoom
  193.  
  194.    // Bubbles
  195.    if(IsMulti())
  196.       SetTimerEx(4 + 5 * rand(), 2, 0, 0);
  197.    else
  198.       SetTimerEx(2 + 5 * rand(), 2, 0, 0);
  199.  
  200.    aiRemoveAlignmentPriority(-1);      // Remove any extant alignment priorities.
  201.    Return;
  202.  
  203. # ........................................................................................
  204.  
  205. shutdown:
  206.    aiRemoveAlignmentPriority(-1);      // Remove any extant alignment priorities.
  207.    return;
  208.  
  209. # ........................................................................................
  210.  
  211. killed:
  212.    if(player != GetSenderRef()) Return;
  213.  
  214.    if(IsMulti())
  215.    {
  216.       CreateBackpack(player);
  217.       ClearActorFlags(player, 0x2000);
  218.    }
  219.  
  220.    SetActionCog(-1, 0);
  221.  
  222.    // Clear the secondary freezing and blinding flags
  223.    // (For carbonite and flash bombs).
  224.    ClearActorFlags(player, 0x18000000);
  225.  
  226.    // clean up force powers stuff
  227.    totalStop = 1;
  228.    call stop_powers;
  229.  
  230.    // clean up items stuff
  231.    if(frozenEffectHandle!=-1)
  232.    {
  233.       freeColorEffect(frozenEffectHandle);
  234.       frozenEffectHandle = -1;
  235.    }
  236.    extraFreezeTime = 0.0;
  237.  
  238.    if(flashEffectHandle!=-1)
  239.    {
  240.       freeColorEffect(flashEffectHandle);
  241.       flashEffectHandle = -1;
  242.    }
  243.    extraBlindTime = 0.0;
  244.    flashNow = 0;
  245.  
  246.    Return;
  247.  
  248. # ........................................................................................
  249.  
  250. damaged:
  251.    damageType = GetParam (1);
  252.    damage = GetParam(0);
  253.  
  254.    // Special case for when the player is carbo frozen.
  255.    if (frozenNow)
  256.    {
  257.       // Unfreeze the player.
  258.       if(frozenEffectHandle!=-1)
  259.       {
  260.          freeColorEffect(frozenEffectHandle);
  261.          frozenEffectHandle = -1;
  262.       }
  263.  
  264.       ClearActorFlags(player, 0x200000);
  265.       ClearActorFlags(player, 0x40000);
  266.       ClearThingFlags(player, 0x14);
  267.       ClearActorFlags(player, 0x40);
  268.  
  269.       if (meCarbonited)
  270.       {
  271.          DestroyThing(meCarbonited);
  272.          meCarbonited = 0;
  273.       }
  274.  
  275.       // broadcast the carbonite statue explosion to all players
  276.       SendTrigger(-1, 99001,
  277.                   GetThingSector(player),
  278.                   VectorX(GetThingPos(player)),
  279.                   VectorY(GetThingPos(player)),
  280.                   VectorZ(GetThingPos(player)));
  281.  
  282.       frozenNow = 0;
  283.  
  284.       ReturnEx(GetThingHealth(player) * 10);
  285.    }
  286.    else
  287.    {
  288.       if (damage >= GetThingHealth(player))
  289.          // If the user is about to get killed on the EWEB, switch to fists.
  290.          if (GetCurWeapon(player) == 10)
  291.             SelectWeapon(player, GetWeaponBin(1));
  292.  
  293.       if (!IsMulti())
  294.       {
  295.          killedByRancor = 0;
  296.          if (damage >= GetThingHealth(player))
  297.          {
  298.             if (GetThingParent(GetSourceRef()) != player)
  299.                SendMessageEx(GetThingClassCog(GetThingParent(GetSourceRef())), user5, GetThingParent(GetSourceRef()), 0, 0, 0);
  300.          }
  301.  
  302.          if (killedByRancor)
  303.          {
  304.             if (damage >= GetThingHealth(player))
  305.                damage = GetThingHealth(player) - 0.1;
  306.          }
  307.          else if (BitTest (damageType, 0x20))
  308.             call make_bubbles;
  309.       }
  310.       else if (BitTest (damageType, 0x01))
  311.          damage = damage * jkGetMultiParam (22);
  312.       else if (BitTest (damageType, 0x02))
  313.          damage = damage * jkGetMultiParam (23);
  314.       else if (BitTest (damageType, 0x04))
  315.          damage = damage * jkGetMultiParam (24);
  316.       else if (BitTest (damageType, 0x08))
  317.          damage = damage * jkGetMultiParam (25);
  318.       else if (BitTest (damageType, 0x10))
  319.          damage = damage * jkGetMultiParam (26);
  320.       else if (BitTest (damageType, 0x20))
  321.       {
  322.          call make_bubbles;
  323.          damage = damage * jkGetMultiParam (27);
  324.       }
  325.       else if (BitTest (damageType, 0x40))
  326.          damage = damage * jkGetMultiParam (28);
  327.  
  328.       ReturnEx(damage);
  329.    }
  330.  
  331.    Return;
  332.  
  333. # ........................................................................................
  334.  
  335. make_bubbles:
  336.    playersector = GetThingSector(player);
  337.    playerpos    = VectorAdd(GetThingPos(player), '0 0 0.075');
  338.  
  339.    for(bub = 1; bub < 1 + 3 * rand(); bub = bub + 1)
  340.    {
  341.       CreateThingAtPosNR(bubble_tpl[3 * rand()], playersector, VectorAdd(playerpos, VectorScale(VectorNorm(VectorSet(rand()-0.5, rand()-0.5, rand()-0.5)), 0.05)), '0 0 0');
  342.       Sleep(0.05);
  343.  
  344.       // Don't create too many bubbles over the network...
  345.       if(!IsMulti())
  346.       {
  347.          CreateThingAtPos(bubble_tpl3, playersector, VectorAdd(playerpos, VectorScale(VectorNorm(VectorSet(rand()-0.5, rand()-0.5, rand()-0.5)), 0.05)), '0 0 0');
  348.          Sleep(0.05);
  349.       }
  350.    }
  351.  
  352.    Return;
  353.  
  354. # ........................................................................................
  355.  
  356. newplayer:
  357.  
  358.    // Shut all the power stuff down (just in case)
  359.    totalStop = 1;
  360.    call stop_powers;
  361.  
  362.    call init_kyle;
  363.  
  364.    // If it's multiplayer
  365.    if(IsMulti()) call init_multi_kyle;
  366.  
  367.    // Start Bubbles
  368.    SetTimerEx(2 + 5 * rand(), 2, 0, 0);
  369.  
  370.    Return;
  371.  
  372. # ........................................................................................
  373.  
  374. timer:
  375.    if(GetSenderId() == 1)                    // Invulnerable for a while
  376.    {
  377.       // make the player vulnerable again if 40 frames have
  378.       // been displayed, else add another half second...
  379.       if(jkGetOpenFrames() > 40)
  380.          ClearActorFlags(GetParam(0), 8);
  381.       else
  382.          SetTimerEx(0.50, 1, player, 0);
  383.  
  384.       Return;
  385.    }
  386.    else
  387.    if(GetSenderId() == 2)                    // Bubbles check
  388.    {
  389.       if(GetThingHealth(player) < 1) Return;
  390.  
  391.       if((GetThingFlags(player) & 0x2000000) && !(GetPhysicsFlags(player) & 0x100000))
  392.          call make_bubbles;
  393.  
  394.       if(IsMulti())
  395.          SetTimerEx(4 + 5 * rand(), 2, 0, 0);
  396.       else
  397.          SetTimerEx(2 + 5 * rand(), 2, 0, 0);
  398.  
  399.       Return;
  400.    }
  401.    else
  402.    if(GetSenderId() == 19)
  403.    {
  404.       // Remove the Force Defense icon
  405.       SetInvActivated(player, 19, 0);
  406.       Return;
  407.    }
  408.    else
  409.    if(GetSenderId() == 24)
  410.    {
  411.       // A pulled weapon must be made takeable again
  412.       SetCollideType(GetParam(0), 1);
  413.       Return;
  414.    }
  415.    else
  416.    if(GetSenderId() == 27)
  417.    {
  418.       if(blindingEffectHandle!=-1)
  419.       {
  420.          freeColorEffect(blindingEffectHandle);
  421.          blindingEffectHandle = -1;
  422.       }
  423.       // Get the effect ramping down
  424.       AddDynamicTint(player, 200 + 8 * rank, 210 + 10 * rank, 200 + 8 * rank);
  425.       ClearActorFlags(player, 0x800);
  426.       force_blinding = 0;
  427.       Return;
  428.    }
  429.    else
  430.    if(GetSenderId() == 31)
  431.    {
  432.       if(griptrackID != -1)
  433.       {
  434.          StopKey(player, griptrackID, 0.1);
  435.          griptrackID = -1;
  436.       }
  437.       ClearActorFlags(player, 0x40000);
  438.       Return;
  439.    }
  440.    else
  441.    if(GetSenderId() == 1035) // Thaw out
  442.    {
  443.       if (frozenNow)
  444.       {
  445.          if (!extraFreezeTime)
  446.          {
  447.             PlaySoundThing(thawSound, player, 1.0, -1, -1, 0x180);
  448.  
  449.             if(frozenEffectHandle!=-1)
  450.             {
  451.                freeColorEffect(frozenEffectHandle);
  452.                frozenEffectHandle = -1;
  453.             }
  454.  
  455.             ClearActorFlags(player, 0x200000);
  456.             ClearActorFlags(player, 0x40000);
  457.             ClearThingFlags(player, 0x14);
  458.             ClearActorFlags(player, 0x40);
  459.             if (meCarbonited)
  460.             {
  461.                DestroyThing(meCarbonited);
  462.                meCarbonited = 0;
  463.             }
  464.  
  465.             frozenNow = 0;
  466.          }
  467.          else
  468.          {
  469.                // We've been hit more than once, so we need to extend the freeze time.
  470.             SetTimerEx(extraFreezeTime, 1035, player, 0);  // Make an appointment for "Unthawing"
  471.             extraFreezeTime = 0.0;
  472.          }
  473.       }
  474.       Return;
  475.    }
  476.    else
  477.    if(GetSenderId() == 1036) // I can see!
  478.    {
  479.       if (flashLevelR > 0.3)
  480.       {
  481.             // If the effect handle was freed...
  482.          if(flashEffectHandle!=-1)
  483.          {
  484.             flashLevelR = flashLevelR - 0.3;
  485.  
  486.             if (flashLevelG >= 0.3)
  487.                flashLevelG = flashLevelG - 0.3;
  488.             else
  489.                flashLevelG = 0.0;
  490.  
  491.             if (flashLevelB >= 0.3)
  492.                flashLevelB = flashLevelB - 0.3;
  493.             else
  494.                flashLevelB = 0.0;
  495.  
  496.             freeColorEffect(flashEffectHandle);
  497.  
  498.             flashEffectHandle = newColorEffect(0, 0, 0,  0, 0, 0,  40*flashLevelR, 40*flashLevelG, 40*flashLevelB,  1.0);
  499.  
  500.             SetTimerEx(0.3, 1036, player, 0);
  501.          }
  502.       }
  503.       else
  504.       {
  505.          flashLevelR = 0.0;
  506.          flashLevelG = 0.0;
  507.          flashLevelB = 0.0;
  508.          flashNow = 0;
  509.  
  510.          if(flashEffectHandle!=-1)
  511.          {
  512.             freeColorEffect(flashEffectHandle);
  513.             flashEffectHandle = -1;
  514.          }
  515.       }
  516.       Return;
  517.    }
  518.    else
  519.    if(GetSenderId() == 1100)
  520.    {
  521.       PlaySoundThing(hmmmSound, player, 1.0, -1, -1, 0x180);
  522.    }
  523.    else
  524.    if(GetSenderId() == 1200)
  525.    {
  526.       if (iAlignmentPriority != -1)
  527.       {
  528.          aiRemoveAlignmentPriority(iAlignmentPriority);
  529.  
  530.          iAlignmentPriority = -1;
  531.       }
  532.    }
  533.    else
  534.    if(GetSenderId() == 102) // They (i.e. an AI thing) can see!
  535.    {
  536.       victim = GetParam(0);
  537.       ClearActorFlags(victim, 0x800);
  538.    }
  539.    else
  540.    if(GetSenderId() == 101) // They (i.e. an AI thing) are thawed!
  541.    {
  542.       victim = GetParam(0);
  543.  
  544.       SendMessageEx(GetInvCog(player, 68), user1, victim, 0, 0, 0);
  545.  
  546.       // Make actor visible
  547.       ClearThingFlags(victim, 0x14);
  548.  
  549.       // Enable actor's AI
  550.       AIClearMode(victim, 0x2000);
  551.  
  552.       // Destroy actor's carbonite dummy
  553.       DestroyThing(GetParam(1));
  554.    }
  555.    else
  556.    if(GetSenderId() == 2000) // Resync player pos over the net.
  557.    {
  558.       victim = GetParam(0);
  559.       SyncThingPos(victim);
  560.    }
  561.    else
  562.    if(GetSenderId() == 2001) // Arm the player with their primary weapon.
  563.    {
  564.       SelectWeapon(player, GetParam(0));
  565.       SetCurInvWeapon(player, GetParam(0));
  566.  
  567.       // if it is the saber, make sure the blade is extended
  568.       if(GetParam(0) == 131)
  569.          jkSetFlags(player, 0x81);
  570.    }
  571.    else
  572.    if((GetSenderId() == 2005) || (GetSenderID() > 2100 && GetSenderID() < 2199))
  573.       // Put a thing on top of another thing.
  574.    {
  575.       SendTrigger(-1, 99002, GetParam(0), GetParam(1), 0, 0);
  576.    }
  577.    else
  578.    if(GetSenderId() == 2006) // Reset Zoom Params.
  579.    {
  580.       SetCameraZoom(0, 1.0, 500.0);
  581.    }
  582.    else
  583.    if(GetSenderId() == 2007)  // Set a remote thing user data.
  584.    {
  585.       k = GetThingGUID(GetParam(0));
  586.       m = k / 0x10000;
  587.       k = k & 0xFFFF;
  588.  
  589.       i = GetThingGUID(GetParam(1));
  590.       j = i / 0x10000;
  591.       i = i & 0xFFFF;
  592.  
  593.       SendTrigger(-1, 99010, k, m, i, j);
  594.    }
  595.  
  596.    Return;
  597.  
  598. # ........................................................................................
  599.  
  600. preblock:
  601. //   if(player != GetSenderRef()) Return;
  602. //
  603. //      // Do we want to block something with the saber?
  604. //   if (GetInv(player, 14) < 0.1)
  605. //   {
  606. //         // Don't have the mana!
  607. //      ReturnEx(0);
  608. //   }
  609. //   else
  610. //   {
  611. //      ChangeInv(player, 14, 0.1);
  612.  
  613.       ReturnEx(-1);
  614. //   }
  615.  
  616.    return;
  617.  
  618. # ........................................................................................
  619.  
  620. blocked:
  621.    if(player != GetSenderRef()) Return;
  622.  
  623.    if (blockPOVTrack != -1)
  624.    {
  625.       jkStopPOVKey( player, blockPOVTrack, 0.1 );
  626.       blockPOVTrack = -1;
  627.    }
  628.    if (blockTrack != -1)
  629.    {
  630.       StopKey( player, blockTrack, 0.1 );
  631.       blockTrack = -1;
  632.    }
  633.  
  634.    // PlaySoundThing(hitSound14, player, 1.0, -1, -1, 0);
  635.    blockPOVTrack = jkPlayPOVKey(player, povBlockAnim0[nextBlock], 2, 0x1a);
  636.    blockTrack = PlayKey(player, blockAnim0[nextBlock], 2, 0x1a);
  637.  
  638.    nextBlock = nextBlock + 1;
  639.    if(nextBlock > 2)
  640.       nextBlock = 0;
  641.  
  642.    Return;
  643.  
  644. # ........................................................................................
  645.  
  646. // This message is sent from the weap_saber_m.cog
  647. user0:
  648.    if (blockPOVTrack != -1)
  649.    {
  650.       jkStopPOVKey( player, blockPOVTrack, 0.1 );
  651.       blockPOVTrack = -1;
  652.    }
  653.    if (blockTrack != -1)
  654.    {
  655.       StopKey( player, blockTrack, 0.1 );
  656.       blockTrack = -1;
  657.    }
  658.    Return;
  659.  
  660. # ........................................................................................
  661.  
  662. // This message is sent by both the carbonite (exp_cpel)
  663. // and flash bomb (exp_flash) explosion cogs.
  664. user1:
  665.    if (GetParam(0) == 1)      // Carbonite
  666.    {
  667.       victim = GetParam(2);
  668.  
  669.       AISetMode(victim, 0x2000);                // Disable the actor's AI.
  670.       AISetMoveThing(victim, victim);           // Set the thing as it's own
  671.                                                 // destination so it stops moving.
  672.  
  673.       // Make victim invisible
  674.       SetThingFlags(victim, 0x14);
  675.       aiCarbonited = CreateThing(carboDummy, victim);
  676.       AttachThingToThing(aiCarbonited, victim);
  677.  
  678.       SendMessageEx(GetInvCog(player, 68), user0, victim, 0, 0, 0);
  679.  
  680.       SetTimerEx(GetParam(1), 101, victim, aiCarbonited);   // Make an appointment for "Unthawing"
  681.    }
  682.    else
  683.    if (GetParam(0) == 2) // Flash bomb
  684.    {
  685.       victim = GetParam(2);
  686.       SetActorFlags(victim, 0x10000000);
  687.  
  688.       SetTimerEx(GetParam(1), 102, victim, 0);  // Make an appointment for "Unblinding"
  689.    }
  690.    else
  691.    if (GetParam(0) == 3) // Alignment jump
  692.    {
  693.       aiSetDistractor(-1);
  694.  
  695.       if (iAlignmentPriority != -1)
  696.       {
  697.          aiRemoveAlignmentPriority(iAlignmentPriority);
  698.  
  699.          iAlignmentPriority = -1;
  700.       }
  701.  
  702.       iAlignmentPriority = aiAddAlignmentPriority(1.0, 3);
  703.  
  704.       KillTimerEx(1200);
  705.       SetTimerEx(4.0, 1200, 0, 0);
  706.    }
  707.    Return;
  708.  
  709. # ........................................................................................
  710.  
  711. user5:
  712.    killedByRancor=1;
  713.    return;
  714.  
  715. # ........................................................................................
  716.  
  717. skill:
  718.    // player might be dead when skill: arrives over the net...
  719.    if(GetThingHealth(player) <= 0) Return;
  720.  
  721.    // Handle multiplayer force power effects
  722.    bin = GetParam(0);
  723.    rank = GetParam(1);
  724.  
  725.    defenseFactor = 1.0;
  726.  
  727.    if(bin == 24)                             // Force Pull
  728.    {
  729.       ReturnEx(0);
  730.  
  731.       if(inbubble || frozenNow) Return;
  732.  
  733.       curWeapon = GetCurWeapon(player);
  734.  
  735.       // check for unpullable weapons
  736.       if(curWeapon == 1) Return;
  737.       if(curWeapon == jkGetMultiParam(38)) Return;
  738.       if(curWeapon == jkGetMultiParam(39)) Return;
  739.  
  740.       // Absorb makes player immune to Pull
  741.       if(IsInvActivated(player, 28)) Return;
  742.  
  743.       // Force Defense
  744.       if(rand() < GetInv(player, 19) * 0.25)
  745.       {
  746.          SetInvActivated(player, 19, 1);
  747.          KillTimerEx(19);
  748.          SetTimerEx(0.5, 19, 0, 0);
  749.          defenseFactor = 1 - GetInv(player, 19) * 0.25;
  750.          PlaySoundThing(defenseSound, player, 1.0, -1, -1, 0x80);
  751.       }
  752.  
  753.       // If the EWEB gun is up, point it at whoever's using the force on us.
  754.       if (curWeapon == 10)
  755.       {
  756.          if (GetSourceRef())           // if there is a source thing
  757.          {
  758.             // Calculate which part of the player was struck.
  759.             playerpos = GetThingPos(player);
  760.             tempvec = GetThingPos(GetThingParent(GetSourceRef()));
  761.  
  762.             tempvec = VectorSub(tempvec, playerpos);
  763.             tempvec = VectorNorm(tempvec);
  764.             SetThingLook(player, tempvec);
  765.          }
  766.       }
  767.       else
  768.       {
  769.          // Special case for the scope.  Pull the rifle instead.
  770.          if (curWeapon == 13) curWeapon = 3;
  771.  
  772.          // Special case for the Manual Sequencer.  Pull the automatic instead.
  773.          if (curWeapon == 18) curWeapon = 8;
  774.  
  775.          // Create a powerup corresponding to the current weapon
  776.          // but if defense worked pull a battery instead...
  777.          if(defenseFactor == 1.0)
  778.             PulledWeapon = CreateThingAtPos(tpl[curWeapon], GetThingSector(player), GetThingPos(player), '0 0 0');
  779.          else
  780.             PulledWeapon = CreateThingAtPos(batteryTpl, GetThingSector(player), GetThingPos(player), '0 0 0');
  781.  
  782.          // Make the powerup collide later
  783.          SetTimerEx(0.2, 24, PulledWeapon, 0);
  784.  
  785.          // Duplicate for internet games
  786.          if (IsMulti())
  787.             SetTimerEx(0.25, 24, PulledWeapon, 0);
  788.  
  789.          // Throw the powerup at the player
  790.          ApplyForce(PulledWeapon, VectorScale(VectorNorm(VectorSub(GetThingPos(GetSourceRef()), GetThingPos(player))), 30));
  791.  
  792.          if(defenseFactor == 1.0)
  793.          {
  794.             // Remove the weapon from the player
  795.             ChangeInv(player, GetWeaponBin(curWeapon), -1);
  796.  
  797.             // Switch to fists
  798.             SelectWeapon(player, 121);
  799.          }
  800.  
  801.          ReturnEx(1);
  802.       }
  803.  
  804.       Return;
  805.    }
  806.    else
  807.    if (bin == 27)                            // Force Blinding
  808.    {
  809.       ReturnEx(0);
  810.  
  811.       if(inbubble || frozenNow) Return;
  812.  
  813.       // Force Defense
  814.       if(GetInv(player, 19) != 0.0)
  815.       {
  816.          SetInvActivated(player, 19, 1);
  817.          KillTimerEx(19);
  818.          SetTimerEx(0.5, 19, 0, 0);
  819.          PlaySoundThing(defenseSound, player, 1.0, -1, -1, 0x80);
  820.       }
  821.  
  822.       defenseFactor = 1 - GetInv(player, 19) * 0.1;
  823.  
  824.       if((!force_blinding) && (!IsInvActivated(player, 23)))   // Seeing makes player immune to Blinding
  825.       {
  826.          force_blinding = 1;
  827.          blindingEffectHandle = newColorEffect(0, 0, 0, 0, 0, 0, 200 + 8 * rank, 210 + 10 * rank, 200 + 8 * rank, 1.0);
  828.          SetActorFlags(player, 0x800);
  829.          SetTimerEx(4 * rank * jkGetMultiParam (31) * defenseFactor, 27, player, 0);
  830.          ReturnEx(1);
  831.       }
  832.  
  833.       Return;
  834.    }
  835.    else
  836.    if (bin == 31)                            // Force Grip
  837.    {
  838.       ReturnEx(0);
  839.  
  840.       if(inbubble || frozenNow) Return;
  841.  
  842.       // Protection makes player immune to Grip
  843.       if(IsInvActivated(player, 29)) Return;
  844.  
  845.       // Force Defense
  846.       if(rand() < GetInv(player, 19) * 0.1)
  847.       {
  848.          SetInvActivated(player, 19, 1);
  849.          KillTimerEx(19);
  850.          SetTimerEx(0.5, 19, 0, 0);
  851.          Return;
  852.       }
  853.  
  854.       griptrackID = PlayMode(player, 25);
  855.       SetActorFlags(player, 0x40000);
  856.  
  857.       // Print("You are taking Grip damage");
  858.       jkPrintUNIString(player, 300);
  859.       DamageThing(player, 2 * rank * jkGetMultiParam(32) / (1 - GetInv(player, 19) * 0.125), 0x8, GetSourceRef());
  860.       SetTimerEx(0.5, 31, player, 0);
  861.       ReturnEx(1);
  862.  
  863.       Return;
  864.    }
  865.    else
  866.    if (bin == 34)                            // Deadly Sight
  867.    {
  868.       ReturnEx(0);
  869.  
  870.       if(inbubble) Return;
  871.  
  872.       // Force Defense
  873.       if(rand() < GetInv(player, 19) * 0.1)
  874.       {
  875.          SetInvActivated(player, 19, 1);
  876.          KillTimerEx(19);
  877.          SetTimerEx(0.5, 19, 0, 0);
  878.          Return;
  879.       }
  880.  
  881.       // Print("You are taking Deadly Sight damage");
  882.       jkPrintUNIString(player, 301);
  883.       DamageThing(player, 4 * rank * jkGetMultiParam (33), 0x8, GetSourceRef());
  884.       smoke = CreateThingAtPosNR(smoke_tpl, GetThingSector(player), GetThingPos(player), '0 0 0');
  885.  
  886.       // Raise the tint above the normal damage tint
  887.       if(GetCurrentCamera() == 0)
  888.          AddDynamicTint(player, 0.15, 0.0, 0.07);
  889.  
  890.       ReturnEx(1);
  891.       Return;
  892.    }
  893.    else
  894.    if (bin == 38)                            // Force Push
  895.    {
  896.       ReturnEx(0);
  897.  
  898.       if(inbubble) Return;
  899.  
  900.       // Absorb makes player immune to Push
  901.       if(IsInvActivated(player, 28)) Return;
  902.  
  903.       // Force Defense
  904.       if(GetInv(player, 19) != 0.0)
  905.       {
  906.          SetInvActivated(player, 19, 1);
  907.          KillTimerEx(19);
  908.          SetTimerEx(0.5, 19, 0, 0);
  909.          PlaySoundThing(defenseSound, player, 1.0, -1, -1, 0x80);
  910.       }
  911.  
  912.       defenseFactor = 1 - GetInv(player, 19) * 0.1;
  913.  
  914.       ApplyForce(player, VectorScale(VectorNorm(VectorSub(GetThingPos(player),GetThingPos(GetSourceRef()))), 120 * rank * defenseFactor));
  915.       ReturnEx(1);
  916.       Return;
  917.    }
  918.    else
  919.    if (bin == 39)                            // Chain Lightning
  920.    {
  921.       ReturnEx(0);
  922.  
  923.       if(inbubble) Return;
  924.  
  925.       // Print("You are taking Chain Lightning damage");
  926.       jkPrintUNIString(player, 302);
  927.  
  928.       // rank is actually the damage here
  929.       DamageThing(player, rank, 0x8, GetSourceRef());
  930.  
  931.       ReturnEx(1);
  932.       Return;
  933.    }
  934.    else
  935.    if (bin == 1035)                            // Carbonite Freeze
  936.    {
  937.       if(!IsInvActivated(player, 62))     // Don't freeze if super shield is on.
  938.       if (GetCurWeapon(player) != 10)     // Don't freeze if the EWEB is up.
  939.       {                                   // This is a kludge to avoid double
  940.          if (!frozenNow)                  // traffic on the 0x10 thing flag.
  941.          {                                // Remind me to fix it if I forget - rf.
  942. //          print("Brrr...");
  943.  
  944.             extraFreezeTime = 0;
  945.             frozenNow = 1;
  946.  
  947.             PlaySoundThing(freezeSound, player, 1.0, -1, -1, 0x180);
  948.  
  949.             StopThing(player);
  950.             SetActorFlags(player, 0x200000); // Freeze the player
  951.             SetActorFlags(player, 0x40000);  // Freeze the player
  952.             SetActorFlags(player, 0x40);
  953.  
  954.                // Invisibility
  955.             SetThingFlags(player, 0x14);
  956.             meCarbonited = CreateThing(carboDummy, player);
  957.             AttachThingToThing(meCarbonited, player);
  958.  
  959.             // Warn some force powers that the player is carbonited so they terminate [YB]
  960.             SendMessageEx(GetInvCog(player, 31), user0, 0, 0, 0, 0); // grip
  961.             SendMessageEx(GetInvCog(player, 34), user0, 0, 0, 0, 0); // deadly sight
  962.             SendMessageEx(GetInvCog(player, 35), user0, 0, 0, 0, 0); // far sight
  963.  
  964.             frozenEffectHandle = newColorEffect(0.5, 0.5, 1.0,  0, 0, 0,  0, 0, 0,  1.0);
  965.  
  966.                // Resync the player pos.
  967.             SetTimerEx(0.3, 2000, player, 0);
  968.  
  969.              // Resync the statue pos
  970.             SetTimerEx(0.4, 2000, meCarbonited, 0);
  971.  
  972.                // Stick the two things together.
  973.             SetTimerEx(0.2, 2007, meCarbonited, player);
  974.             SetTimerEx(0.7, 2007, meCarbonited, player);
  975.  
  976. //            SetTimerEx(0.5, 2005, meCarbonited, player);
  977. //            SetTimerEx(0.7, 2100, meCarbonited, player);
  978. //            SetTimerEx(0.9, 2101, meCarbonited, player);
  979. //            SetTimerEx(0.6, 2102, player, meCarbonited);
  980. //            SetTimerEx(0.8, 2103, player, meCarbonited);
  981. //            SetTimerEx(1.0, 2104, player, meCarbonited);
  982.  
  983.  
  984.                // Rank is the length of the freeze in seconds.
  985.             SetTimerEx(rank * jkGetMultiParam (34), 1035, player, 0);   // Make an appointment for "Unthawing"
  986.          }
  987.          else
  988.          {
  989.                // If we are already frozen, add the new freeze time to the old.
  990. //          extraFreezeTime = extraFreezeTime + rank * jkGetMultiParam (34);
  991.          }
  992.       }
  993.    }
  994.    else
  995.    if (bin == 1036)                            // Flash blinding
  996.    {
  997.          // Make the player "Blink"
  998.       if ((rank == -2) || (IsInvActivated(player, 23)))   // Seeing makes player immune to Flash bombs
  999.       {
  1000.          if (!flashNow)
  1001.          {
  1002.             if(flashEffectHandle!=-1)
  1003.                freeColorEffect(flashEffectHandle);
  1004.  
  1005.             flashEffectHandle = newColorEffect(0, 0, 0,  0, 0, 0,  255, 255, 255,  1.0);
  1006.  
  1007.             flashLevelR = 0.0;
  1008.             flashLevelG = 0.0;
  1009.             flashLevelB = 0.0;
  1010.  
  1011.             SetTimerEx(0.1, 1036, player, 0);
  1012.             flashNow = 1;
  1013.          }
  1014.       }
  1015.       else if ((rank == -1) && (!IsInvActivated(player, 23)))   // Seeing makes player immune to Flash bombs
  1016.       {
  1017.          if (!flashNow)
  1018.          {
  1019.             if(flashEffectHandle!=-1)
  1020.                freeColorEffect(flashEffectHandle);
  1021.  
  1022.             flashEffectHandle = newColorEffect(0, 0, 0,  0, 0, 0,  0, 255, 0,  1.0);
  1023.  
  1024.             flashLevelR = 0.0;
  1025.             flashLevelG = 0.0;
  1026.             flashLevelB = 0.0;
  1027.  
  1028.             SetTimerEx(0.1, 1036, player, 0);
  1029.             flashNow = 1;
  1030.          }
  1031.       }
  1032.       else if ((flashLevelB < rank) && (!IsInvActivated(player, 23)))   // Seeing makes player immune to Flash bombs
  1033.       {
  1034.             // Existing flash blindness grants
  1035.             // partial resistance to new effects.
  1036.          rank = rank - (flashLevelB / 2);
  1037.          if (flashLevelB >= rank)
  1038.          {
  1039.             ReturnEx(-1);
  1040.             return;
  1041.          }
  1042.  
  1043.          // Affect red, green and blue differently.
  1044.          flashLevelR = rank*1.4;
  1045.          flashLevelG = rank*1.2;
  1046.          flashLevelB = rank*1.0;
  1047.  
  1048.          if(flashEffectHandle!=-1)
  1049.             freeColorEffect(flashEffectHandle);
  1050.  
  1051.          flashEffectHandle = newColorEffect(0, 0, 0,  0, 0, 0,  40*flashLevelR, 40*flashLevelG, 40*flashLevelB,  1.0);
  1052.  
  1053.          if (!flashNow)
  1054.             SetTimerEx(0.3, 1036, player, 0);
  1055.  
  1056.          flashNow = 1;
  1057.       }
  1058.    }
  1059.    else
  1060.    if (bin == 1100)
  1061.    {
  1062.       if (GetInv(player, 93) < 2.0)
  1063.       {
  1064.          SetTimerEx(2.0, 1100, 0, 0);
  1065.          SetInv(player, 93, 5.0 + rand() * 2.0);
  1066.       }
  1067.       else
  1068.       {
  1069.          ChangeInv(player, 93, -1.0);
  1070.       }
  1071.    }
  1072.  
  1073.    ReturnEx(-1);
  1074.    Return;
  1075.  
  1076. # ........................................................................................
  1077.  
  1078. splash:
  1079.    // splash: messages are only sent to the local player's cogs
  1080.    // (class cog and capture cog) for performance reasons...
  1081.  
  1082.    sender = GetSenderRef();
  1083.    source = GetSourceRef();
  1084.  
  1085.    // actor or player ?
  1086.    if((GetThingType(sender) == 2) || (GetThingType(sender) == 10))
  1087.    {
  1088.       // whatever source (i.e. enter or leave, don't care)
  1089.       a_splash = CreateThingAtPosNR(splash_tpl2, GetThingSector(sender), GetThingPos(sender), '0 0 0');
  1090.    }
  1091.    // these are mostly the projectiles...
  1092.    else
  1093.    {
  1094.       // on entering only
  1095.       if(source == 1)
  1096.          // not if player is submerged, but still do it if he's on the surface
  1097.          if(!(GetThingFlags(player) & 0x2000000) || (GetPhysicsFlags(player) & 0x100000))
  1098.             a_splash = CreateThingNR(splash_tpl, sender);
  1099.    }
  1100.  
  1101.    Return;
  1102.  
  1103. # ........................................................................................
  1104.  
  1105. init_kyle:
  1106.  
  1107.    SetTimerEx(0.1, 2006, 0, 0);     // Reset camera zoom
  1108.  
  1109.    // make the player invul for a short time
  1110.    SetActorFlags(player, 8);
  1111.    SetTimerEx(2.00, 1, player, 0);
  1112.  
  1113.    // Set Health to full
  1114.    SetThingHealth(player, 100);
  1115.  
  1116.    // Set Mana to full
  1117.    SetInv(player, 14, GetInv(player, 20) * 50);
  1118.  
  1119.    // Set Shields to 100 minimum
  1120.    if(GetInv(player, 60) < 100) SetInv(player, 60, 100);
  1121.  
  1122.    // Set Battery to 100 minimum
  1123.    if(GetInv(player, 13) < 100) SetInv(player, 13, 100);
  1124.  
  1125.    // Set the power boost to 1.0
  1126.    SetInv(player, 63, 1.0);
  1127.  
  1128.    // When player starts, give him fists, bryar, and a saber.
  1129.    SetInv(player, 121, 1.0);
  1130.    SetInv(player, 122, 1.0);
  1131.    SetInv(player, 131, 1.0);
  1132.  
  1133.    // Give 50 energy minimum
  1134.    if(GetInv(player, 11) < 50) SetInv(player, 11, 50.0);
  1135.  
  1136.    // Bacta
  1137.    if(GetInv(player, 40) == 0)
  1138.       SetInvAvailable(player, 40, 0);
  1139.    else
  1140.       SetInvAvailable(player, 40, 1);
  1141.  
  1142.    // IR Goggles
  1143.    if(GetInv(player, 41))
  1144.       SetInvAvailable(player, 41, 1);
  1145.    else
  1146.       SetInvAvailable(player, 41, 0);
  1147.    SetInvActivated(player, 41, 0);
  1148.  
  1149.    // Field Light
  1150.    SetInv(player, 42, 1);
  1151.    SetInvAvailable(player, 42, 1);
  1152.    SetInvActivated(player, 42, 0);
  1153.    ClearActorFlags(player, 4);
  1154.  
  1155.    jkEndTarget();
  1156.  
  1157.    Return;
  1158.  
  1159. # ........................................................................................
  1160.  
  1161. init_multi_kyle:
  1162.    // Clear all ammo
  1163.    SetInv(player, 11, 50.0);
  1164.    SetInv(player, 12, 0.0);
  1165.    SetInv(player, 13, 75.0);
  1166.    SetInv(player, 15, 0.0);
  1167.    SetInv(player, 90, 0.0);
  1168.    SetInv(player, 91, 0.0);
  1169.    SetInv(player, 92, 0.0);
  1170.  
  1171.    // Clear all weapons (except fists)
  1172.    for (i = 122; i <= 140; i = i + 1)
  1173.       SetInv (player, i, 0);
  1174.    SetInv(player, GetWeaponBin(1), 1);
  1175.  
  1176.    // Remove bacta tank and IR goggles
  1177.    SetInv(player, 40, 0);
  1178.    SetInv(player, 41, 0);
  1179.    SetInvAvailable(player, 40, 0);
  1180.    SetInvAvailable(player, 41, 0);
  1181.  
  1182.    // Set shields to 100 by default
  1183.    SetInv(player, 60, 100);
  1184.  
  1185.    // Now initialize the inventory
  1186.    for (i = 1; i <= 10; i = i + 1)
  1187.    {
  1188.       myParam = jkGetMultiParam (i*2);
  1189.       if(myParam != 0)
  1190.          SetInv(player, myParam, jkGetMultiParam(i*2+1));
  1191.    }
  1192.  
  1193.    // Make these available if they were initialized to non-zero
  1194.    if (GetInv (player, 40) > 0)
  1195.       SetInvAvailable (player, 40, 1);
  1196.    if (GetInv (player, 41) > 0)
  1197.       SetInvAvailable (player, 41, 1);
  1198.  
  1199.    // Set the default running speed
  1200.    ftemp = jkGetMultiParam (40);
  1201.    if (ftemp > 0)
  1202.       SetThingMaxVelocity (player, ftemp);
  1203.    ftemp = jkGetMultiParam (41);
  1204.    if (ftemp > 0)
  1205.       SetThingMaxAngularVelocity (player, ftemp);
  1206.  
  1207.    // Initialize mana
  1208.    ftemp = GetInv(player, 20) * 50;
  1209.    if (ftemp < jkGetMultiParam(120))
  1210.       ftemp = jkGetMultiParam(120);
  1211.    SetInv(player, 14, ftemp);
  1212.  
  1213.    // Do respawn effects
  1214.    dummy = CreateThingAtPos(teleport_particles, GetThingSector(player), GetThingPos(player), '0 0 0');
  1215.    dummy = PlaySoundThing(teleportsnd, player, 1.0, -1, -1, 0x180);
  1216.  
  1217.    // Yes this is a hack... I don't know who/what broke it but this kludges it [YB]
  1218.    SetFireWait(player, -1);
  1219.    SetMountWait(player, 0);
  1220.  
  1221.    SetCurInvWeapon(player, 121);
  1222.    SelectWeapon(player, jkGetMultiParam(1));
  1223.    SetCurInvWeapon(player, jkGetMultiParam(1));
  1224.  
  1225.    SetFireWait(player, -1);
  1226.    SetMountWait(player, 0);
  1227.  
  1228.    // Wait half a second, then select main weapon.
  1229.    SetTimerEx(0.5, 2001, jkGetMultiParam(1), 0);
  1230.  
  1231.    // saber only episode...
  1232.    if(GetMultiModeFlags() & 0x2000)
  1233.    {
  1234.       // remove all ammo
  1235.       SetInv(player, 11, 0.0);
  1236.       SetInv(player, 12, 0.0);
  1237.       SetInv(player, 15, 0.0);
  1238.       SetInv(player, 90, 0.0);
  1239.       SetInv(player, 91, 0.0);
  1240.       SetInv(player, 92, 0.0);
  1241.  
  1242.       // remove all weapons except fists and saber
  1243.       for (i = 122; i <= 140; i = i + 1)
  1244.       {
  1245.          if(i != 131) SetInv(player, i, 0);
  1246.       }
  1247.    }
  1248.  
  1249.    Return;
  1250.  
  1251. # ........................................................................................
  1252.  
  1253. enterbubble:
  1254.    inbubble = 1;
  1255.    totalStop = 0;
  1256.    call stop_powers;
  1257.    Return;
  1258.  
  1259. # ........................................................................................
  1260.  
  1261. exitbubble:
  1262.    inbubble = 0;
  1263.    Return;
  1264.  
  1265. # ........................................................................................
  1266.  
  1267. stop_powers:
  1268.    if(blindingEffectHandle!=-1)
  1269.    {
  1270.       freeColorEffect(blindingEffectHandle);
  1271.       blindingEffectHandle = -1;
  1272.    }
  1273.  
  1274.    ClearActorFlags(player, 0x800);
  1275.    KillTimerEx(27);
  1276.    force_blinding = 0;
  1277.  
  1278.       // Do not turn off carbonite because we entered a bubble.
  1279.    if (totalStop || !frozenNow)
  1280.    {
  1281.       ClearActorFlags(player, 0x200000);
  1282.       ClearActorFlags(player, 0x40000);
  1283.       ClearThingFlags(player, 0x14);
  1284.       ClearActorFlags(player, 0x40);
  1285.  
  1286.       if (meCarbonited)
  1287.       {
  1288.          DestroyThing(meCarbonited);
  1289.          meCarbonited = 0;
  1290.       }
  1291.    }
  1292.  
  1293.    if(griptrackID != -1)
  1294.    {
  1295.       StopKey(player, griptrackID, 0.1);
  1296.       griptrackID = -1;
  1297.    }
  1298.    Return;
  1299.  
  1300. # ........................................................................................
  1301.  
  1302. trigger:
  1303.  
  1304.    // TRIGGER_CARBXPLODE
  1305.    if(GetSourceRef() == 99001)
  1306.    {
  1307.       carboSector = GetParam(0);
  1308.       carboPosition = VectorSet(GetParam(1), GetParam(2), GetParam(3));
  1309.  
  1310.       // switch to LOCAL | NOSYNC mode to do this operation
  1311.       // so these 10 network messages are not sent to everyone...
  1312.       oldFlags = GetCogFlags(GetSelfCog());
  1313.       ClearCogFlags(GetSelfCog(), 0xffffffff);
  1314.       SetCogFlags(GetSelfCog(), 0x240);
  1315.  
  1316.       debris = CreateThingAtPos(c0Tpl, carboSector, carboPosition, '0 0 0');
  1317.       SetThingVel(debris, VectorSet(rand()-0.5, rand()-0.5, 1.2));
  1318.       debris = CreateThingAtPos(c1Tpl, carboSector, carboPosition, '0 0 0');
  1319.       SetThingVel(debris, VectorSet(rand()-0.5, rand()-0.5, 1.2));
  1320.       debris = CreateThingAtPos(c2Tpl, carboSector, carboPosition, '0 0 0');
  1321.       SetThingVel(debris, VectorSet(rand()-0.5, rand()-0.5, 1.2));
  1322.       debris = CreateThingAtPos(c3Tpl, carboSector, carboPosition, '0 0 0');
  1323.       SetThingVel(debris, VectorSet(rand()-0.5, rand()-0.5, 1.2));
  1324.       debris = CreateThingAtPos(c4Tpl, carboSector, carboPosition, '0 0 0');
  1325.       SetThingVel(debris, VectorSet(rand()-0.5, rand()-0.5, 1.2));
  1326.  
  1327.       // switch back to old mode
  1328.       ClearCogFlags(GetSelfCog(), 0xffffffff);
  1329.       SetCogFlags(GetSelfCog(), oldFlags);
  1330.    }
  1331.    else
  1332.    if(GetSourceRef() == 99002)   // Position one object on another
  1333.    {
  1334.       // switch to LOCAL | NOSYNC mode to do this operation
  1335.       // so these 10 network messages are not sent to everyone...
  1336.       oldFlags = GetCogFlags(GetSelfCog());
  1337.       ClearCogFlags(GetSelfCog(), 0xffffffff);
  1338.       SetCogFlags(GetSelfCog(), 0x240);
  1339.  
  1340.       victim = GetParam(0);
  1341.       perp = GetParam(1);
  1342.  
  1343.       SetThingPosEx(victim, GetThingPos(perp), GetThingSector(perp));
  1344.  
  1345.       // switch back to old mode
  1346.       ClearCogFlags(GetSelfCog(), 0xffffffff);
  1347.       SetCogFlags(GetSelfCog(), oldFlags);
  1348.    }
  1349.    else
  1350.    if(GetSourceRef() == 99003)   // Set an object's joint angle.
  1351.    {
  1352.       // switch to LOCAL | NOSYNC mode to do this operation
  1353.       // so these 10 network messages are not sent to everyone...
  1354.       oldFlags = GetCogFlags(GetSelfCog());
  1355.       ClearCogFlags(GetSelfCog(), 0xffffffff);
  1356.       SetCogFlags(GetSelfCog(), 0x240);
  1357.  
  1358.       SetThingJointAngle(GetParam(0), GetParam(1), GetParam(2));
  1359.  
  1360.          // Correct some stuff.
  1361.       tempvec = GetThingLVec(GetParam(0));
  1362.       tempvec = VectorSet(VectorX(tempvec), VectorY(tempvec), 0.0);
  1363.       SetThingLook(GetParam(0), tempvec);
  1364.  
  1365.       // switch back to old mode
  1366.       ClearCogFlags(GetSelfCog(), 0xffffffff);
  1367.       SetCogFlags(GetSelfCog(), oldFlags);
  1368.    }
  1369.    else
  1370.    if(GetSourceRef() == 99010)   // Set a thing's user data.
  1371.    {
  1372.       i = GetParam(2);
  1373.       j = GetParam(3);
  1374.  
  1375.       i = i | (j * 0x10000);
  1376.  
  1377.       k = GetParam(0);
  1378.       m = GetParam(1);
  1379.  
  1380.       k = k | (m * 0x10000);
  1381.  
  1382.       SetThingUserData(GetGuidThing(k), GetGuidThing(i)+5000);
  1383.    }
  1384.    Return;
  1385.  
  1386. end
  1387.